const dataKit = require( "./dataKit");
const dateKit = require("./dateKit");
const util = require("./util");
/**
 * 注意：使用await的方法必须加上async，不然会报错！！
 */
module.exports = {
   /**
    * 根据openId获取商户
    * @param {*} openId 商户的openid
    */
   async getMerchantByOpenId(context,openId){
      if(!openId){
         console.info("getMerchantByOpenId --> openId是必须的");
         return null;
      }
      //过滤条件
      const filter = {openId: openId};
      let merchant =await dataKit.findOne(context,"merchant_info",filter);
      return merchant;
   },
   
   /**
    * 获取商户唯一的商户AccessToken
    */
   async getDefaultMerchantAccessToken(context){
      //过滤条件
      const filter = {};
      let merchant =await dataKit.findOne(context,"merchant_info",filter);
      return merchant.accessToken;
   },

   /**
    * 更据openId获取商户唯一的商户AccessToken
    */
   async getByOpenIdAccessToken(context,openId){
      //过滤条件
      const filter = {openId:openId};
      let merchant =await dataKit.findOne(context,"merchant_info",filter);
      return merchant.accessToken;
   },

   /**
    * 商品列表
    * @param {*} context 
    * @param {*} openId 商户的openid
    * @param {*} cid 类目id
    */
   async getProductList(context){
      const accessToken =await this.getDefaultMerchantAccessToken(context);
      const result = await context.cloud.topApi.invoke({  
        api: 'taobao.items.onsale.get',  
        autoSession: false,
        data:{
           session:accessToken,
           fields:"num_iid,title,cid,price,pic_url",
           page_size:200
        }  
      });
      return result;
   },
    /**
     * 判断用户是否是会员
     * @param {*} context 上下文
     * @param {*} nick 用户 nick
     */
    async isTaobaoMember(context,mix_nick) {
        const accessToken =await this.getDefaultMerchantAccessToken(context);
        const identity = await context.cloud.topApi.invoke({
            api:'taobao.crm.member.identity.get',
            autoSession: false,
            data:{
                session: accessToken,
                mix_nick
            }
        });
        if (identity.result.member_info) {// 是会员
            return true;
        }else {
            return false;
        }
    },
    /**
     * 查询用户淘宝订单列表
     * @param {*} context 
     * @param {*} access_token 商家 token
     * @param {*} open_id 用户open_id
     * @param {Object} param 参数
     *  @param {String} access_token 用户token
     *  @param {String} open_id 用户 open_id
     *  @param {String} start_created 查询范围开始时间
     *  @param {String} end_created 结束时间
     */
    async taobaoApiToSoldOrders(context,param) {
        const trades = await context.cloud.topApi.invoke({
            api:'taobao.open.trades.sold.get',
            autoSession: false,
            data: {
                session: param.access_token,
                fields: 'tid,orders',
                buyer_open_id: param.open_id,
                start_created: param.start_created,
                end_created: param.end_created,
                type: 'tmall_i18n',
                status: 'TRADE_FINISHED',// 交易成功
                page_no: 1,
                page_size: 100
            }
        });
        // 判断用户是否有购买过订单
        if (!trades || trades.total_results <= 0) {
            return false;
        } else {
            return true;
        }
    },
    /**
     *  CRM会员积分查询开放接口
     * @param {*} context 上下文
     * @param {*} mix_nick 用户 mix_nick
     */
    async getAvailablePoint(context,mix_nick) {
        const accessToken =await this.getDefaultMerchantAccessToken(context);
        const result = await context.cloud.topApi.invoke({
            api:'taobao.crm.point.available.get',
            autoSession: false,
            data:{
                session: accessToken,
                mix_nick: mix_nick
            }
        });
        return result;
    },
   /**
    * 新增用户数（天）
    * @param {*} context 
    * @param {*} day 
    */
   async getDayNewUserCount(context,day){
      let createTime = {
         $gte:day+" 00:00:00",
         $lt:day+" 23:59:59"
      };
      const resArr = await dataKit.aggregate(context,"user_info",[
         {
            $match:{createTime}
          },
         {
            $group:{
               _id:null,
               total:{ $sum:1 }
            }
         },
      ]);
      return resArr[0].total;
   },
    
   /**
     * CRM会员积分变更接口
     * @param {*} context 
     * @param {*} open_id 
     * @param {String} opt_type 操作类型，0：增加，1：扣减 （注意需要传字符串！！）
     * @param {*} quantity  积分数量
     */
    async changePoint(context,open_id,opt_type,quantity) {
       let access_token = await this.getDefaultMerchantAccessToken(context);
        //变更类型：0交易，1：互动活动，2：权益兑换，3：手工调整
        try {
          const change_type = 1;
          const trades = await context.cloud.topApi.invoke({
            api:'taobao.crm.point.change',
            autoSession: false,
            data: {
                session: access_token,
                change_type,
                open_id,
                opt_type,
                quantity
            }
          });
          //return trades;
          return {success:200,msg:trades.request_id}
        } catch (e) {
          return {success:500,msg:e.sub_msg}
        }
    },

     /**
    * 发奖接口 
    * @param {*} context 
    * @param {*} receiver_id  接收奖品的用户openId
    * @param {*} right_ename 发放的权益(奖品)唯一标识
    * @param {*} unique_id 幂等校验id，业务重试需要，自定义唯一字段即可
    *  * 返回：
        result_msg	String	发放成功	接口返回消息
        result_code	String	SEND_SUCCESS	接口返回代码
        result_success	Boolean	true	是否处理成功
        right_id	Number	891033	权益id
        prize_name	String	广陌测试虚拟奖品	奖品名称
    */
   async sendBenefit(context,receiver_id,right_ename,unique_id,openId){
     const accessToken =await this.getByOpenIdAccessToken(context,openId);
      var uuid = util.uuid();
      try {
        const result = await context.cloud.topApi.invoke({  
            api: 'alibaba.benefit.send',  
            autoSession: false,
            data:{
              session:accessToken,
              right_ename:right_ename,
              receiver_id:receiver_id,
              unique_id:uuid,
              user_type:"taobao",
              app_name:"mtop",
            }  
          });
          if(result.result_code == "SUCCESS"){
            return {success:200,msg:result.result_msg}
          }else{
            return {success:500,msg:result.result_msg}
          }
      } catch (e) {
        return {success:500,msg:e} 
      } 
   },

    /**
     * 根据openId获取用户信息
     */
    async getUserByOpenId(context,openId){
      if(!openId){
        console.log("getUserByopenId --> openId是必须的");
        return {code:500,msg:"getUserByopenId --> openId是必须的"}
      }
      var userInfo = await context.cloud.db.collection('user_info').find({openId:openId},{limit:1});
      return userInfo.length > 0 ? userInfo[0] : null;
    },

    /**
     * 关注店铺
     * @param {} context 
     * @param {*} openId 
     */
    async follow(context,openId){
      var taskList = await context.cloud.db.collection('task_record').find({openId:openId,type:"follow"},{limit:1});
      if(taskList.length > 0){
        return {code:500,msg:'用户已关注'}
      }
      //抽奖次数 （+1）
      var userInfo = await dataKit.findOne(context,"user_info",{openId:openId});
      await dataKit.update(context, "user_info", {openId:openId},{drawNum:userInfo.drawNum + 1});
      var taskRecord = {
        openId:openId,//用户唯一标识
        userNick:userInfo.userNick,//用户淘宝昵称
        type:'follow',	//任务类型：
        productId:'',//商品id（浏览商品的时候用到，其他情况为空）
        remark:'关注店铺',	//备注
        createTime:dateKit.getCurrentDateTime(),	//保存时间
      }
      await dataKit.insertOne(context,'task_record',taskRecord);
      return {code:200,msg:'关注成功'}
    },

     /**
     * 收藏商品
     */
    // async collectProduct(context,openId,productId){
    //   var record = await dataKit.findOne(context,"task_record",{openId:openId,productId:productId,type:'collectProduct'});
    //   if(record != null){
    //     return {code:500,msg:'商品已收藏'}
    //   }
    //   var userInfo = await dataKit.findOne(context,"user_info",{openId:openId});
    //   var taskRecord = {
    //     openId:openId,//用户唯一标识
    //     userNick:userInfo.userNick,//用户淘宝昵称
    //     type:'collectProduct',	//任务类型：
    //     productId:productId,//商品id（浏览商品的时候用到，其他情况为空）
    //     remark:'收藏商品',	//备注
    //     createTime:dateKit.getCurrentDateTime(),	//保存时间
    //   }
    //   await dataKit.insertOne(context,'task_record',taskRecord);
    //   let collectProductList = await dataKit.find(context,"task_record",{openId:openId,type:'collectProduct'});
    //   if(collectProductList.length == 3){
    //     //抽奖次数 （+1）
    //     await dataKit.update(context, "user_info", {openId:openId},{drawNum:userInfo.drawNum + 1});
    //   }
    //   return {code:200,msg:'收藏商品成功'};
    // },

    /**
     * 收藏商品
     */
    async collectProduct(context,openId){
      var taskList = await context.cloud.db.collection('task_record').find({openId:openId,type:"collectProduct"},{limit:1});
      if(taskList.length > 0){
        return {code:500,msg:'商品已收藏'}
      }
      //抽奖次数 （+1）
      var userInfo = await dataKit.findOne(context,"user_info",{openId:openId});
      await dataKit.update(context, "user_info", {openId:openId},{drawNum:userInfo.drawNum + 1});
      var taskRecord = {
        openId:openId,//用户唯一标识
        userNick:userInfo.userNick,//用户淘宝昵称
        type:'collectProduct',	//任务类型：
        productId:'',//商品id（浏览商品的时候用到，其他情况为空）
        remark:'收藏商品',	//备注
        createTime:dateKit.getCurrentDateTime(),	//保存时间
      }
      await dataKit.insertOne(context,'task_record',taskRecord);
      return {code:200,msg:'收藏商品成功'}
    },

    /**
     * 加购商品
     */
    // async kagaProduct(context,openId,productId){
    //  var record = await dataKit.findOne(context,"task_record",{openId:openId,productId:productId,type:'kagaProduct'});
    //   if(record != null){
    //     return {code:500,msg:'商品已加购'}
    //   }
    //   var userInfo = await dataKit.findOne(context,"user_info",{openId:openId});
    //   var taskRecord = {
    //     openId:openId,//用户唯一标识
    //     userNick:userInfo.userNick,//用户淘宝昵称
    //     type:'kagaProduct',	//任务类型：
    //     productId:productId,//商品id（浏览商品的时候用到，其他情况为空）
    //     remark:'加购商品',	//备注
    //     createTime:dateKit.getCurrentDateTime(),	//保存时间
    //   }
    //   await dataKit.insertOne(context,'task_record',taskRecord);
    //   let kagaProductList = await dataKit.find(context,"task_record",{openId:openId,type:'kagaProduct'});
    //   if(kagaProductList.length == 3){
    //     //抽奖次数 （+1）
    //     await dataKit.update(context, "user_info", {openId:openId},{drawNum:userInfo.drawNum + 1});
    //   }
    //   return {code:200,msg:'加购商品成功'};
    // },

     /**
     * 加购商品
     */
    async kagaProduct(context,openId){
      var taskList = await context.cloud.db.collection('task_record').find({openId:openId,type:"kagaProduct"},{limit:1});
      if(taskList.length > 0){
        return {code:500,msg:'商品已加购'}
      }
      //抽奖次数 （+1）
      var userInfo = await dataKit.findOne(context,"user_info",{openId:openId});
      await dataKit.update(context, "user_info", {openId:openId},{drawNum:userInfo.drawNum + 1});
      var taskRecord = {
        openId:openId,//用户唯一标识
        userNick:userInfo.userNick,//用户淘宝昵称
        type:'kagaProduct',	//任务类型：
        productId:'',//商品id（浏览商品的时候用到，其他情况为空）
        remark:'加购商品',	//备注
        createTime:dateKit.getCurrentDateTime(),	//保存时间
      }
      await dataKit.insertOne(context,'task_record',taskRecord);
      return {code:200,msg:'加购商品成功'}
    },

    /**
    * 根据openId获取中奖记录列表
    * @param {*} openId 
    */
   async getPrizeLogByopenIdList(context,openId){
      if(!openId){
         console.info("getGameRecordByOpenId --> openId是必须的");
         return {code: 500, msg: "getUserInfoByOpenId --> openId是必须的"};
      }
      //过滤条件
      const filter = {openId:openId,isWinPrize:true};
      //const filter = {openId:openId,isWinPrize:true,type:1};
      let prizeLog =await dataKit.find(context,"prize_log",filter,{sort: {createTime: -1}});
      return prizeLog;
   },

   /**
     * 埋点
     * @param {埋点} context 
     */
    async buriedPoint(context,openId,userData){
      var buriedPoint = {
                openId:openId,
                userNick:userData.userNick,
                type:userData.type,
                remark:userData.remark,
                data:userData.data,
                createTime:dateKit.getCurrentDateTime()
              };
      await dataKit.insertOne(context,"user_data",buriedPoint);
    },

    /**
     * 埋点
     * @param {埋点} context 
     */
    async getburiedPointList(context){
     let list = await dataKit.findAll(context,"user_data",{createTime:{$gte:"2021-06-10 00:00:00",$lte:"2021-06-20 00:00:00"}},{createTime: -1});
     return list;
    },

}
